<?php

/**
 * Name: 审核请求验证类
 * User: Silent
 * Date: 2025-11-07
 * Time: 17:00:00
 */

namespace App\Http\Requests\Checkin;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Contracts\Validation\Validator;

class ReviewRequest extends FormRequest
{
    /**
     * 判断用户是否有权限进行此请求
     */
    public function authorize()
    {
        return true;
    }

    /**
     * 获取验证规则
     */
    public function rules()
    {
        $rules = [
            'review_status' => 'required|string|in:pending,approved,rejected',
            'review_remark' => 'nullable|string|max:1000',
        ];

        // 根据不同的审核类型添加特定规则
        $routeName = $this->route()->getName();

        if (str_contains($routeName, 'leader')) {
            // 班长审核需要签到人员ID列表
            $rules['sign_ids'] = 'nullable|string|regex:/^(\d+,)*\d+$/';
        }

        if (str_contains($routeName, 'supervisor')) {
            // 主管审核需要班长审核ID列表
            $rules['leader_review_ids'] = 'nullable|string|regex:/^(\d+,)*\d+$/';
            // team_name 可选
            $rules['team_name'] = 'nullable|string|max:255';
        }

        // 如果指定了日期，验证日期格式
        if ($this->has('date')) {
            $rules['date'] = 'required|date_format:Y-m-d|before_or_equal:today';
        }

        return $rules;
    }

    /**
     * 获取验证错误消息
     */
    public function messages()
    {
        return [
            'review_status.required' => '请选择审核状态',
            'review_status.string' => '审核状态格式错误',
            'review_status.in' => '审核状态必须为：待审核、正常或异常',
            'review_remark.string' => '审核备注必须为文本格式',
            'review_remark.max' => '审核备注不能超过1000个字符',
            'sign_ids.string' => '签到人员ID列表格式错误',
            'sign_ids.regex' => '签到人员ID列表格式错误，应为逗号分隔的数字，例如：1,2,3',
            'leader_review_ids.string' => '班长审核ID列表格式错误',
            'leader_review_ids.regex' => '班长审核ID列表格式错误，应为逗号分隔的数字，例如：1,2,3',
            'team_name.required' => '请指定要审核的班组',
            'team_name.string' => '班组名称格式错误',
            'team_name.max' => '班组名称不能超过255个字符',
            'date.required' => '请指定审核日期',
            'date.date_format' => '日期格式错误，请使用YYYY-MM-DD格式',
            'date.before_or_equal' => '审核日期不能超过今天',
        ];
    }

    /**
     * 获取字段别名
     */
    public function attributes()
    {
        return [
            'review_status' => '审核状态',
            'review_remark' => '审核备注',
            'sign_ids' => '签到人员ID列表',
            'leader_review_ids' => '班长审核ID列表',
            'team_name' => '班组名称',
            'date' => '审核日期',
        ];
    }

    /**
     * 自定义验证逻辑
     */
    public function withValidator(Validator $validator)
    {
        $validator->after(function (Validator $validator) {
            $reviewStatus = $this->input('review_status');
            $reviewRemark = $this->input('review_remark');

            // 如果审核状态为异常，备注不能为空
            if ($reviewStatus === 'rejected' && empty($reviewRemark)) {
                $validator->errors()->add('review_remark', '审核状态为异常时，必须填写备注说明原因');
            }

            // 如果审核状态为正常，但有详细备注，确保备注内容合理
            if ($reviewStatus === 'approved' && !empty($reviewRemark)) {
                if (strlen($reviewRemark) < 5) {
                    $validator->errors()->add('review_remark', '备注内容过于简单，请提供更详细的说明');
                }
            }

            // 验证审核日期不能是未来日期
            if ($this->has('date')) {
                $date = $this->input('date');
                if ($date && strtotime($date) > strtotime(today())) {
                    $validator->errors()->add('date', '不能审核未来日期的记录');
                }
            }
        });
    }

    /**
     * 处理验证失败
     */
    protected function failedValidation(Validator $validator)
    {
        $errors = $validator->errors()->toArray();

        // 格式化错误消息
        $formattedErrors = [];
        foreach ($errors as $field => $messages) {
            $formattedErrors[$field] = $messages[0]; // 只取第一个错误消息
        }

        $response = response()->json([
            'code' => 422,
            'message' => '审核数据验证失败',
            'data' => null,
            'errors' => $formattedErrors
        ], 422);

        throw new HttpResponseException($response);
    }

    /**
     * 获取处理后的验证数据
     */
    public function getProcessedData()
    {
        $data = $this->validated();

        // 确保备注字段存在
        if (!isset($data['review_remark'])) {
            $data['review_remark'] = null;
        }

        // 清理备注内容
        if ($data['review_remark']) {
            $data['review_remark'] = trim($data['review_remark']);
        }

        return $data;
    }

    /**
     * 获取审核状态的中文描述
     */
    public function getReviewStatusText()
    {
        $statusMap = [
            'pending' => '待审核',
            'approved' => '正常',
            'rejected' => '异常'
        ];

        $status = $this->input('review_status');
        return $statusMap[$status] ?? '未知';
    }

    /**
     * 检查是否为异常审核
     */
    public function isAbnormalReview()
    {
        return $this->input('review_status') === 'rejected';
    }

    /**
     * 检查是否为正常审核
     */
    public function isNormalReview()
    {
        return $this->input('review_status') === 'approved';
    }
}
